package com.fisicaapp;


import java.text.DecimalFormat;
import java.util.List;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;

import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;



public class Actdiagramacuerpolibre extends Activity implements  SensorEventListener, OnTouchListener {
	private VectorMath vectPeso;
	private VectorMath vectNormal; 
	private VectorMath vectOpuesto;
	private VectorMath fNeta;
	private VectorMath fRoce;
	private double masa, coefRoce;
	
	
	
  private int x1,y1; // ORIGEN
  private int ancho, alto, direccion;        
  private Panel fondo;    
  private TextView txt_info1 ;
  private TextView txt_info2 ;
  private TextView txt_info3 ;
  private TextView txt_info4 ; 
  private TextView txt_info5 ; 
  private Button botonPausar;    
  private   AlertDialog.Builder txtDatos; // creamos variable de mensaje de alerta
  private DecimalFormat df ; // variable para dejar formato de numeros en dos decimales
  private Button botonrDatos;
  
  
  private float accX = 0, accY = 0;    
  private boolean pausa;
  final float alpha = (float)0.8;
  private final float ESCALA = 0.5f;
  	

  @SuppressWarnings("deprecation")
	
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      requestWindowFeature(Window.FEATURE_NO_TITLE);
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
              WindowManager.LayoutParams.FLAG_FULLSCREEN);
      
      this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      setContentView(R.layout.diagramacuerpolibre);

      // ubicacion de los puntos en un comienzo
      txt_info1 = (TextView) findViewById(R.id.text_vector31);
      txt_info2 = (TextView) findViewById(R.id.text_vector32);
      txt_info3 = (TextView) findViewById(R.id.text_vector33);
      txt_info4 = (TextView) findViewById(R.id.text_vector34);
      txt_info5 = (TextView) findViewById(R.id.text_vector35);
      
      botonPausar = (Button) findViewById(R.id.button32);
      botonrDatos = (Button) findViewById(R.id.button31);  
      
      RelativeLayout layout = (RelativeLayout) findViewById(R.id.layoutXXX1); 
      ancho=(int) (getWindowManager().getDefaultDisplay().getWidth()); 
      alto=(int) (getWindowManager().getDefaultDisplay().getHeight());
      
      
      vectPeso = new VectorMath(((double)ancho/2),(double)(alto/2),ancho,alto); // Peso
      vectNormal = new VectorMath(((double)ancho/2),(double)(alto/2),ancho,alto); // Normal
      vectOpuesto = new VectorMath(((double)ancho/2),(double)(alto/2),ancho,alto); // Opuesto
      fNeta = new VectorMath(((double)ancho/2),(double)(alto/2),ancho,alto); // Fuerza neta en X
      fRoce = new VectorMath(((double)ancho/2),(double)(alto/2),ancho,alto); // Fuerza de roce en X
      vectOpuesto.setDefaultXY();
      fNeta.setDefaultXY();
      vectPeso.setDefaultXY();
      vectNormal.setDefaultXY();
      fRoce.setDefaultXY();
      x1 = (int) vectPeso.getOrigenX();
      y1 = (int) vectPeso.getOrigenY();
      direccion = 0;
      txtDatos = new AlertDialog.Builder(this); 
      txtDatos.setTitle("Datos"); 
      df = new DecimalFormat("0.00"); // defino que formato decimal sera de dos decimales (se trunca)
      pausa = false;
      fondo = new Panel(this);
      fondo.setOnTouchListener(this);
      layout.addView(fondo);
      crearAlert();
      

  }
  public void volver(View view) {
     finish();
}
  
  public void reingresarDatos(View view) {
	  
		vectPeso.setDefaultXY();
		vectNormal.setDefaultXY(); 
		vectOpuesto.setDefaultXY();
		fNeta.setDefaultXY() ;
		fRoce.setDefaultXY() ;
		masa = 0;
		coefRoce = 0;
	    pausa = false;
	  
		
		crearAlert();
	}
  
  
  public void crearAlert(){
      AlertDialog.Builder alert = new AlertDialog.Builder(Actdiagramacuerpolibre.this);

  alert.setTitle("Entrada");
  LayoutInflater inflater = this.getLayoutInflater();
  final View v = inflater.inflate(R.layout.inputdiagramacuerpolibre, null);    
  alert.setView(v);
 
  alert.setPositiveButton("Ingresar", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int whichButton) {

          final EditText text1 = (EditText) v.findViewById(R.id.editText231);
          final EditText text2 = (EditText) v.findViewById(R.id.editText232);
         
          Editable val1 = text1.getText();
          Editable val2 = text2.getText();
          String smasa = val1.toString();
          String sroce = val2.toString();
          if(smasa.equals("") || sroce.equals("")){
        	  crearAlert();
        	  txtDatos.setPositiveButton("Cerrar", null);				
        	  txtDatos.setMessage("No ha ingresado datos.");
        	  txtDatos.show();
          }
          else{
        	  masa = Math.abs(Double.parseDouble(smasa));
              coefRoce = Double.parseDouble(sroce);
              if (coefRoce < 0 || coefRoce > 1){
            	  coefRoce = 0;
            	  crearAlert();            	  
            	  txtDatos.setPositiveButton("Cerrar", null);				
            	  txtDatos.setMessage("Coef. roce invalido, Rango [0,1].");
            	  txtDatos.show();
              }
              else if (masa*9.8 > alto/2.0){
            	  masa = 0;
            	  crearAlert();            	  
            	  txtDatos.setPositiveButton("Cerrar", null);				
            	  txtDatos.setMessage("Demasiada masa para desplegar en pantalla el Peso. Rango [0,"+String.valueOf((int)(alto/(2*9.8)))+"]");
            	  txtDatos.show();
              }
          }
          
          
      }
  });
  alert.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int whichButton) {
             
      }
  });
  alert.show();
     
}

  public void pausar(View view){
	  if (!pausa){
		  pausa = true;
		  //vectOpuesto.setDefaultXY();
		  botonPausar.setText("Iniciar");
	  }else{
		  pausa = false;
		  
		  botonPausar.setText("Pausar");
	  }
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.    
  	getMenuInflater().inflate(R.menu.menu_dcl, menu);
      return true;
  }

  
  
  protected void onResume() {
      super.onResume();
      SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
      List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);        
      if (sensors.size() > 0) {
      	sm.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_GAME);
      }
  }
  
  
  protected void onStop() {
  	SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);    	
      sm.unregisterListener(this);
      super.onStop();
  }

  
  public boolean onOptionsItemSelected(MenuItem item) { //acciones para los elementos del menu
      switch (item.getItemId()) {
      case R.id.Datos31:
      	txtDatos.setPositiveButton("Cerrar", null);
      	txtDatos.setMessage("Nada por ahora");
      	 txtDatos.show(); 
          break;

     
      case R.id.Volver32:
      	finish();
          
      }
      return true;
  }

  
  public boolean onTouch(View v, MotionEvent event) { 	  	
  	double x = event.getX();		
  	
	//switch(event.getAction()){
//		case MotionEvent.ACTION_MOVE:
  		if(pausa){
			
  			vectOpuesto.setX(x, true);
			if (Math.abs(vectOpuesto.getX())<0.01) vectOpuesto.setX(0,false);			
			
			double dx = (vectPeso.getX() + vectOpuesto.getX() + fRoce.getX() );
            fNeta.setX(dx, false);
            
            if(fRoce.getMagnitud() > Math.abs(vectPeso.getX()) ){
            	fNeta.setDefaultXY();
            }	            
			
			if (dx > 0){
				direccion = 1;				
			}else if (dx < 0){
				direccion = -1;				
			}else{
				direccion = 0;				
			}
			fondo.invalidate();
  		}
  
	//		break;
			
	//}
      return true;
  }
  
	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {}

	@Override
	public void onSensorChanged(SensorEvent event) {
		
		if (!pausa){
			
	        synchronized (this) {
	        	
	        	vectOpuesto.setDefaultXY();
	        	
	  		  	accX = event.values[0];
	  		  	accY = event.values[1];
	  		  		  		  	
	  		  	if (Math.abs(accX) < 0.01) accX = 0;
	  		  	if (Math.abs(accY) < 0.01) accY = 0;
	  		  	
	            //mantener fijo la magnitud del vector Peso
	            vectPeso.setXY(-accX,-accY,false);
	            double ang = vectPeso.getAngulo();
	            double magnitud = 9.8*masa;
	            vectPeso.setXY2(ang,magnitud,false);
	            vectNormal.setY(-vectPeso.getY(),false);
	            fRoce.setX(vectNormal.getMagnitud()*coefRoce, false);
	            
	            if(vectPeso.getX() > 0){
	            	fRoce.setVectorOpuesto();
	            }
	            double dx = (vectPeso.getX() + vectOpuesto.getX() + fRoce.getX() );
	            fNeta.setX(dx, false);
	            
	            if(fRoce.getMagnitud() > Math.abs(vectPeso.getX()) ){
	            	fNeta.setDefaultXY();
	            }	            
	                  
				if (dx > 0.01){
					direccion = 1;
				}else if (dx < 0.01){
					direccion = -1;
				}else{
					direccion = 0;
				}
	        }
	        fondo.invalidate();
		}
		
	}
	
	//Panel para pintar!
  class Panel extends View {
  	
  	Paint pincelRojoFPeso, pincelAzulFNormal, pincelMoradoFOpuesta, pincelNaranjoFRoce,pincelGrisFNeta;
      
  
      public Panel(Context context) {
          super(context);
          pincelRojoFPeso = new Paint();          
          pincelAzulFNormal = new Paint();
          pincelMoradoFOpuesta = new Paint();
          pincelNaranjoFRoce = new Paint();
          pincelGrisFNeta = new Paint();
          // color del fondo
      	//canvas.drawRGB(255, 255, 0); 
      	// cada linea es un pincel
          
          // atributos de los pinceles
          pincelRojoFPeso.setARGB(255, 255, 0, 0);
          pincelRojoFPeso.setStrokeWidth(3);
          pincelRojoFPeso.setStyle(Paint.Style.STROKE);
          pincelRojoFPeso.setStrokeJoin(Paint.Join.ROUND);
          pincelRojoFPeso.setStrokeCap(Paint.Cap.ROUND);
          
          
          pincelAzulFNormal.setARGB(255, 0, 0, 255);
          pincelAzulFNormal.setStrokeWidth(3);
          pincelAzulFNormal.setStyle(Paint.Style.STROKE);
          pincelAzulFNormal.setStrokeJoin(Paint.Join.ROUND);
          pincelAzulFNormal.setStrokeCap(Paint.Cap.ROUND);
          
          pincelMoradoFOpuesta.setARGB(255, 255, 0, 255);
          pincelMoradoFOpuesta.setStrokeWidth(2);
          pincelMoradoFOpuesta.setStyle(Paint.Style.STROKE);
          pincelMoradoFOpuesta.setStrokeJoin(Paint.Join.ROUND);
          pincelMoradoFOpuesta.setStrokeCap(Paint.Cap.ROUND);
          
          pincelNaranjoFRoce.setARGB(255, 230, 95, 0);
          pincelNaranjoFRoce.setStrokeWidth(3);
          pincelNaranjoFRoce.setStyle(Paint.Style.STROKE);
          pincelNaranjoFRoce.setStrokeJoin(Paint.Join.ROUND);
          pincelNaranjoFRoce.setStrokeCap(Paint.Cap.ROUND);
          
          pincelGrisFNeta.setARGB(255, 128, 128, 128);
          pincelGrisFNeta.setStrokeWidth(3);
          pincelGrisFNeta.setStyle(Paint.Style.STROKE);
          pincelGrisFNeta.setStrokeJoin(Paint.Join.ROUND);
          pincelGrisFNeta.setStrokeCap(Paint.Cap.ROUND);
          
          txt_info1.setTextColor(Color.argb(255, 230, 95, 0)); //naranjo
          txt_info2.setTextColor(Color.BLUE);
          txt_info4.setTextColor(Color.MAGENTA);
          txt_info3.setTextColor(Color.RED);
          txt_info5.setTextColor(Color.GRAY);
      }

      protected void onDraw(Canvas canvas) {
      	
          // dibujar lineas
    	  txt_info1.setText(
    			  "F.Roce: "+df.format(fRoce.getMagnitud())+"[N]"        			  
				  );
    	  
		  txt_info2.setText(    				  
				  "F.Normal: "+df.format(vectNormal.getMagnitud())+"[N]"
				  );
		  
		  txt_info3.setText(    				  
				  "Peso: "+df.format(vectPeso.getMagnitud())+"[N]"
				  ); 
		  
		  txt_info4.setText(    				  
				  "F.Opuesta: "+df.format(vectOpuesto.getMagnitud())+"[N]"
				  );
          switch(direccion){
          case -1:
    		  txt_info5.setText(  
    				  "Fuerza Neta <-" + Html.fromHtml("<br />") +
    				  "F.Neta: "+df.format(fNeta.getMagnitud())+"[N]"
    				  );    				  
        	  break;
          case 0:
        	  txt_info5.setText(  
    				  "Fuerza Neta 0" + Html.fromHtml("<br />") +
    				  "F.Neta: "+df.format(fNeta.getMagnitud())+"[N]"
    				  );    	  
        	  break;          
          case 1:
        	  txt_info5.setText(  
    				  "Fuerza Neta ->" + Html.fromHtml("<br />") +
    				  "F.Neta: "+df.format(fNeta.getMagnitud())+"[N]"
    				  );
        	  break;
          }
    	  
          if(pausa){
        	    double dx = vectPeso.getX() + vectOpuesto.getX()+ fRoce.getX();
	            fNeta.setX(dx, false);
        	  
              
              // RESULTANTE EN VECTOR PESO
              canvas.drawLine(x1, y1, (int) vectPeso.getXReal(), (int) vectPeso.getYReal(), pincelRojoFPeso);
              canvas.drawLine((int) vectPeso.getXReal(), (int) vectPeso.getYReal(),
              		(int) vectPeso.getFlechaIzqXReal(),(int) vectPeso.getFlechaIzqYReal(),
              		pincelRojoFPeso);
              canvas.drawLine((int) vectPeso.getXReal(), (int) vectPeso.getYReal(),
              		(int) vectPeso.getFlechaDerXReal(),(int) vectPeso.getFlechaDerYReal(),
              		pincelRojoFPeso);
              
           // FUERZA NETA
              canvas.drawLine(x1, y1, (int) fNeta.getXReal(), (int) fNeta.getYReal(), pincelGrisFNeta);
              canvas.drawLine((int) fNeta.getXReal(), (int) fNeta.getYReal(),
              		(int) fNeta.getFlechaIzqXReal(),(int) fNeta.getFlechaIzqYReal(),
              		pincelGrisFNeta);
              canvas.drawLine((int) fNeta.getXReal(), (int) fNeta.getYReal(),
              		(int) fNeta.getFlechaDerXReal(),(int) fNeta.getFlechaDerYReal(),
              		pincelGrisFNeta);
              
           // FUERZA ROCE
              canvas.drawLine(x1, y1, (int) fRoce.getXReal(), (int) fRoce.getYReal(), pincelNaranjoFRoce);
              canvas.drawLine((int) fRoce.getXReal(), (int) fRoce.getYReal(),
              		(int) fRoce.getFlechaIzqXReal(),(int) fRoce.getFlechaIzqYReal(),
              		pincelNaranjoFRoce);
              canvas.drawLine((int) fRoce.getXReal(), (int) fRoce.getYReal(),
              		(int) fRoce.getFlechaDerXReal(),(int) fRoce.getFlechaDerYReal(),
              		pincelNaranjoFRoce);
              
           // VECTOR OPUESTO X
              canvas.drawLine(x1, y1, (int) vectOpuesto.getXReal(), (int) vectOpuesto.getYReal(), pincelMoradoFOpuesta);
              canvas.drawLine((int) vectOpuesto.getXReal(), (int) vectOpuesto.getYReal(),
              		(int) vectOpuesto.getFlechaIzqXReal(),(int) vectOpuesto.getFlechaIzqYReal(),
              		pincelMoradoFOpuesta);
              canvas.drawLine((int) vectOpuesto.getXReal(), (int) vectOpuesto.getYReal(),
              		(int) vectOpuesto.getFlechaDerXReal(),(int) vectOpuesto.getFlechaDerYReal(),
              		pincelMoradoFOpuesta);
           
              
        	  
          }
          else{
        	  

          	// VECTOR NORMAL
           
            canvas.drawLine(x1, y1, (int) vectNormal.getXReal(), (int) vectNormal.getYReal(), pincelAzulFNormal);
            canvas.drawLine((int) vectNormal.getXReal(), (int) vectNormal.getYReal(),
            		(int) vectNormal.getFlechaIzqXReal(),(int) vectNormal.getFlechaIzqYReal(),
            		pincelAzulFNormal);
            canvas.drawLine((int) vectNormal.getXReal(), (int) vectNormal.getYReal(),
            		(int) vectNormal.getFlechaDerXReal(),(int) vectNormal.getFlechaDerYReal(),
            		pincelAzulFNormal);
            
            // RESULTANTE EN VECTOR PESO
            canvas.drawLine(x1, y1, (int) vectPeso.getXReal(), (int) vectPeso.getYReal(), pincelRojoFPeso);
            canvas.drawLine((int) vectPeso.getXReal(), (int) vectPeso.getYReal(),
            		(int) vectPeso.getFlechaIzqXReal(),(int) vectPeso.getFlechaIzqYReal(),
            		pincelRojoFPeso);
            canvas.drawLine((int) vectPeso.getXReal(), (int) vectPeso.getYReal(),
            		(int) vectPeso.getFlechaDerXReal(),(int) vectPeso.getFlechaDerYReal(),
            		pincelRojoFPeso);
            
            
            
            
            
         // FUERZA NETA
            canvas.drawLine(x1, y1, (int) fNeta.getXReal(), (int) fNeta.getYReal(), pincelGrisFNeta);
            canvas.drawLine((int) fNeta.getXReal(), (int) fNeta.getYReal(),
            		(int) fNeta.getFlechaIzqXReal(),(int) fNeta.getFlechaIzqYReal(),
            		pincelGrisFNeta);
            canvas.drawLine((int) fNeta.getXReal(), (int) fNeta.getYReal(),
            		(int) fNeta.getFlechaDerXReal(),(int) fNeta.getFlechaDerYReal(),
            		pincelGrisFNeta);
            
         // FUERZA ROCE
            canvas.drawLine(x1, y1, (int) fRoce.getXReal(), (int) fRoce.getYReal(), pincelNaranjoFRoce);
            canvas.drawLine((int) fRoce.getXReal(), (int) fRoce.getYReal(),
            		(int) fRoce.getFlechaIzqXReal(),(int) fRoce.getFlechaIzqYReal(),
            		pincelNaranjoFRoce);
            canvas.drawLine((int) fRoce.getXReal(), (int) fRoce.getYReal(),
            		(int) fRoce.getFlechaDerXReal(),(int) fRoce.getFlechaDerYReal(),
            		pincelNaranjoFRoce);
         
            
        	  
          }
    		
    	  
         
          
         
          }
      
  } // termina la clase Panel
  
 
  
  
 
 
}